From db4a6040afd3d1cabbb306037e811f37d62e2e76 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 19 Dec 2011 12:39:53 +0100 Subject: [PATCH] x11: Avoid spurious focus events on grabs We want to avoid handling focus events for the private focus window, otherwise the keyboard grab taken by for example buttons will cause a spurious FOCUS_OUT/FOCUS_IN on the toplevel. The code that did this seems to have been lost in the XI2 transition for GTK3. https://bugzilla.gnome.org/show_bug.cgi?id=657578 --- gdk/x11/gdkdevicemanager-core-x11.c | 5 +++++ gdk/x11/gdkdevicemanager-xi2.c | 1 + gdk/x11/gdkdevicemanagerprivate-core.h | 3 +++ 3 files changed, 9 insertions(+) diff --git a/gdk/x11/gdkdevicemanager-core-x11.c b/gdk/x11/gdkdevicemanager-core-x11.c index 156ba8bfd8..503ad5489c 100644 --- a/gdk/x11/gdkdevicemanager-core-x11.c +++ b/gdk/x11/gdkdevicemanager-core-x11.c @@ -665,6 +665,7 @@ gdk_x11_device_manager_core_translate_event (GdkEventTranslator *translator, case FocusIn: case FocusOut: _gdk_device_manager_core_handle_focus (window, + xevent->xfocus.window, device_manager->core_keyboard, NULL, xevent->type == FocusIn, @@ -795,6 +796,7 @@ _gdk_x11_event_translate_keyboard_string (GdkEventKey *event) */ void _gdk_device_manager_core_handle_focus (GdkWindow *window, + Window original, GdkDevice *device, GdkDevice *source_device, gboolean focus_in, @@ -819,6 +821,9 @@ _gdk_device_manager_core_handle_focus (GdkWindow *window, if (!toplevel) return; + if (toplevel->focus_window == original) + return; + had_focus = HAS_FOCUS (toplevel); switch (detail) diff --git a/gdk/x11/gdkdevicemanager-xi2.c b/gdk/x11/gdkdevicemanager-xi2.c index 273ca7dfb9..f9e4d110f0 100644 --- a/gdk/x11/gdkdevicemanager-xi2.c +++ b/gdk/x11/gdkdevicemanager-xi2.c @@ -1228,6 +1228,7 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator, GUINT_TO_POINTER (xev->sourceid)); _gdk_device_manager_core_handle_focus (window, + xev->event, device, source_device, (ev->evtype == XI_FocusIn) ? TRUE : FALSE, diff --git a/gdk/x11/gdkdevicemanagerprivate-core.h b/gdk/x11/gdkdevicemanagerprivate-core.h index 428b34fdd1..54463bb2fa 100644 --- a/gdk/x11/gdkdevicemanagerprivate-core.h +++ b/gdk/x11/gdkdevicemanagerprivate-core.h @@ -20,6 +20,8 @@ #ifndef __GDK_DEVICE_MANAGER_PRIVATE_CORE_H__ #define __GDK_DEVICE_MANAGER_PRIVATE_CORE_H__ +#include + #include "gdkx11devicemanager-core.h" #include "gdkdevicemanagerprivate.h" @@ -38,6 +40,7 @@ struct _GdkX11DeviceManagerCoreClass }; void _gdk_device_manager_core_handle_focus (GdkWindow *window, + Window original, GdkDevice *device, GdkDevice *source_device, gboolean focus_in, -- 2.30.2